//池化技术之线程池
//我们先创建好一批线程，然后把任务分配给它们处理 
#include<iostream>
#include<ctime>
#include"Task.hpp"
#include"ThreadPool.hpp"

//pthread_spinlock_t slock;
//自旋锁：当一个线程尝试获取一个已经被其他线程持有的自旋锁时，该线程不会进入休眠状态，而是在 CPU 上“自旋”，即忙等待，直到锁被释放。这适用于锁持有时间非常短的情况，因为忙等待避免了线程调度的开销。

int main()
{
    cout<<"process run..."<<endl;
    sleep(3);
    
    //放在静态区的员函数可以直接调用,因为没有this指针，不用使用实例化对象来调用
    ThreadPool<Task>::GetInstance()->Start();//通过返回的线程池指针启动线程池中的全部线程
    srand(time(nullptr)^getpid());
    while(true)
    {
        //构建任务：
        int x=rand()%10+1;
        usleep(10);
        int y=rand()%5;
        char op=opers[rand()%opers.size()];
        Task t(x,y,op);
        ThreadPool<Task>::GetInstance()->Push(t);//将任务放进任务队列中，线程就会去处理

        cout<<"main thread make task"<<t.GetTask()<<endl;
        sleep(1);
        //每次会构建一个任务给任务队列后，就会唤醒一个线程进行处理
    }
}
